package cn.fz.controller;

import cn.fz.entity.User;
import cn.fz.mapper.UserMapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.*;

/**
 * SpringCache使用：
 *   1.pom文件中导入坐标： spring-boot-starter-cache
 *   2.启动类上添加注解：@EnableCaching //作用: 开启缓存注解功能
 *   3.在目标方法上使用下列注解：
 *       @Cacheable: 作用--调用目标方法之前，先查询缓存，如果有缓存数据直接返回;否则调用目标方法,并且将返回值存入到缓存中
 *       @CachePut:  作用--将目标方法的返回值，存入到缓存【一般不怎么用】
 *       @CacheEvict: 作用--清除缓存--可以清理一条也可以清理多条
 */
@RestController
@RequestMapping("/user")
@Slf4j
@Api(tags = "用户管理")
@RequiredArgsConstructor
public class UserController {
    private final UserMapper userMapper;

    /**
     * @CachePut使用：
     *  属性介绍：
     *       cacheNames|value：定义缓存的名称
     *       key：键值
     *            # result 取返回值作为key，如果result是对象，可以通过result.xx获取属性值
     *            # 参数名 取指定名字的参数值
     *            # root.args[0] 取第一个参数的值
     *            # p0 取第一个参数的值,    param
     *            # a0 取第一个参数的值,    args
     *          最终生成的key等于 cacheNames::key
     * @param user User
     * @return User
     */
    @ApiOperation("新增用户")
    @PostMapping
    @CachePut(cacheNames = "user",key = "#result.id")
    public User save(@RequestBody User user){
        userMapper.insert(user);
        return user;
    }

    @ApiOperation("删除用户")
    @DeleteMapping
    @CacheEvict(cacheNames = "user", key = "#id")
    public void deleteById(Long id){
        userMapper.deleteById(id);
    }

    /**
     * @CacheEvict注解使用：
     *  属性介绍：
     *      allEntries属性，默认值为false,设置为true删除cacheNames下全部缓存数据
     *      key属性：代表删除指定的数据
     */
    @ApiOperation("删除所有用户")
    @DeleteMapping("/delAll")
    @CacheEvict(cacheNames = "user",allEntries = true)
    public void deleteAll(){
        userMapper.deleteAll();
    }

    /**
     * @Cacheable使用：
     *  属性介绍：
     *       cacheNames|value：定义缓存的名称
     *       key：键值
     *            # 参数名 取指定名字的参数值
     *            # root.args[0] 取第一个参数的值
     *            # p0 取第一个参数的值,    param
     *            # a0 取第一个参数的值,    args
     *          最终生成的key等于 cacheNames::key
     * @param id Long
     * @return User
     */
    // @Cacheable(cacheNames = "user",key = "#p0")
    // @Cacheable(cacheNames = "user",key = "#a0")
    @Cacheable(cacheNames = "user",key = "#id")
    @ApiOperation("根据id查询用户")
    @GetMapping
    public User getById(Long id){
        return userMapper.getById(id);
    }
}
